home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMICUS25.ADF
/
DiskWipe
/
diskwipe.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-01-26
|
11KB
|
445 lines
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* |_o_o|\\ Copyright (c) 1987 The Software Distillery. All Rights Reserved *
* |. o.| || Written by Doug Walker *
* | . | || The Software Distillery *
* | o | || 235 Trillingham Lane *
* | . |// Cary, NC 27513 *
* ====== BBS:(919)-471-6436 *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#define EXTERN
#include "mydebug.h"
#include "diskwipe.h"
#define MSG_COPYRIGHT 0
#define MSG_DESTROY 1
#define MSG_INSERT 2
#define MSG_USAGE 3
#define MSG_CTRLBK 4
#define MSG_KEEP 5
#define MSG_USE 6
#define MSG_SYS 7
#define MSG_NOMEM 7
#define MSGGETSERR 8
#define MSG_WPROT 8
#define MSG_NODISK 9
#define MSG_BADUNIT 10
#define MSG_INUSE 7
#define MSG_DISKERR 12
char globlen[] =
{
58, 59, 50, 56, 21, 15, 20, 12, 24, 17, 14, 16,
#ifdef MYDEBUG
26
#endif
};
char *globmsg[] =
{
"DISKWIPE 1.0 - Copyright (c) 1987 The Software Distillery\n",
#define DESTROY_SPOT 36
"\n***** WARNING: All data in drive DF0: will be lost! *****\n",
"Insert disk and enter new name or press RETURN to ",
"Usage: diskwipe [MANY] [[DRIVE] <dfn:>] [[NAME] <name>]\n",
"Press CTRL-\\ to quit\n",
"keep old name: ",
"use specified name: ",
"Fatal error\n",
"Disk is write protected\n",
"No disk in drive\n",
"No such drive\n",
"Drive in use\n",
#ifdef MYDEBUG
#define DISKERR_SPOT 22
"Trackdisk error, code \n"
#endif
};
void inhibit(arg1)
LONG arg1;
{
BUG(1, ("inhibit: Entry\n"))
g.msg->mn_ReplyPort = g.packet->dp_Port = g.replyport;
g.msg->mn_Node.ln_Name = (char *)g.packet;
g.msg->mn_Node.ln_Type = NT_MESSAGE;
/* msg->mn_Length = 0; */
g.packet->dp_Link = g.msg;
g.packet->dp_Type = ACTION_INHIBIT;
g.packet->dp_Arg1 = arg1;
PutMsg(g.dosport, g.msg);
WaitPort(g.replyport);
(void)GetMsg(g.replyport);
BUG(1, ("inhibit: Exit, res1 %ld res2 %ld\n", g.packet->dp_Res1, g.packet->dp_Res2))
}
void iopanic()
{
#ifdef MYDEBUG
short code;
#endif
register int iomsg;
BUG(1, ("iopanic: Entry, io_Error = %d\n", TDREQ(io_Error)))
switch(TDREQ(io_Error))
{
case TDERR_WriteProt: iomsg = MSG_WPROT; break; /* 28 */
case TDERR_DiskChanged: iomsg = MSG_NODISK; break; /* 29 */
case TDERR_BadUnitNum: /* 32 */
case TDERR_BadDriveType: iomsg = MSG_BADUNIT; break; /* 33 */
case TDERR_DriveInUse: iomsg = MSG_INUSE; break; /* 34 */
default:
#ifdef MYDEBUG
code = (TDREQ(io_Error)) & 255;
BUG(100, ("iopanic: code is %d\n", (unsigned int)code))
globmsg[MSG_DISKERR][DISKERR_SPOT] = '0' + (short)(code/(short)100);
code %= (short)100;
BUG(100, ("iopanic: code is %d\n", (unsigned int)code))
globmsg[MSG_DISKERR][DISKERR_SPOT+1] = '0' + (short)(code/(short)10);
code %= (short)10;
BUG(100, ("iopanic: code is %d\n", (unsigned int)code))
globmsg[MSG_DISKERR][DISKERR_SPOT+2] = '0' + code;
iomsg = MSG_DISKERR;
break;
#else
iomsg = MSG_SYS;
#endif
}
panic(iomsg);
}
void panic(msgnum)
int msgnum;
{
BUG(1, ("panic: Entry\n"))
g.errnum++;
if(msgnum>=MSGGETSERR) Write(g.outfile, "ERROR: ", 7L);
PUTTERM(msgnum);
enditall();
}
void GetName(diskname)
char *diskname;
{
int i;
char *tmpchar;
BUG(1, ("GetName: Entry\n"))
#ifdef NOTDOS
if(!(g.flags & DW_NOTDOS))
{
#endif
TDREQ(io_Length) = MYIOSIZE;
TDIO(CMD_READ);
BUG(100, ("Getname: TDIO done\n"))
tmpchar = (char *)(TDREQ(io_Data));
if(tmpchar[3] != 2 || tmpchar[511] != 1) goto DEFNAME;
memcpy(diskname, tmpchar+433, i=min(30, (int)tmpchar[432]));
diskname[i] = '\0';
BUG(100, ("GetName: %d chars in name\n", i))
BUG(1, ("GetName: Exit, name is '%s'\n", diskname))
return;
#ifdef NOTDOS
}
#endif
DEFNAME:
BUG(10, ("GetName: Root block not initialized, using default\n"))
strcpy(diskname, "Dos disk");
BUG(1, ("GetName: Exit, name is '%s'\n", diskname))
}
long checksum(block)
long *block;
{
long sum;
int i;
for(i=0, sum = 0L; i<128; i++) sum += block[i];
BUG(100, ("checksum: returning %ld\n", -sum))
return(-sum);
}
void makeroot(buffer, diskname)
long *buffer;
char *diskname;
{
int i;
memset((char *)buffer, 0, TD_SECTOR);
buffer[0] = 2L; /* Type */
buffer[3] = 72L; /* Hashtable size */
buffer[79] = 881L; /* Block to contain the bitmap */
*(((char *)buffer)+432) = i = strlen(diskname);
memcpy(((char *)buffer)+433, diskname, i);
DateStamp(buffer+121); /* Volume creation date */
DateStamp(buffer+105); /* Volume last modified date */
buffer[127] = 1L; /* Secondary type for root */
buffer[5] = checksum(buffer);
}
void DosTerm()
{
BUG(1, ("DosTerm: enter\n"))
if(g.replyport)
{
BUG(10, ("DosTerm: Disposing of replyport\n"))
inhibit(0L);
DisposePort(g.replyport);
g.replyport = (struct MsgPort *)NULL;
}
if(g.msg) FreeMem((char *)g.msg, sizeof(struct Message));
if(g.packet) FreeMem((char *)g.packet, sizeof(struct DosPacket));
g.msg = (struct Message *)(g.packet = (struct DosPacket *)NULL);
BUG(1, ("DosTerm: exit \n"))
}
void DosInit(device)
int device;
{
char devname[5];
BUG(1, ("DosInit: Entry\n"))
strcpy(devname, "df0:");
devname[2] = '0' + device;
if( !(g.msg = (struct Message *)AllocMem(sizeof(struct Message),
MEMF_PUBLIC|MEMF_CLEAR)) ||
!(g.packet = (struct DosPacket *)AllocMem(sizeof(struct DosPacket),
MEMF_PUBLIC|MEMF_CLEAR)) ||
!(g.replyport = NewPort())
)
panic(MSG_NOMEM);
g.dosport = (struct MsgPort *)DeviceProc(devname);
inhibit(1);
}
void enditall()
{
BUG(1, ("Enditall: Entry\n"))
TDTerm();
BUG(100, ("Enditall: TDTerm done\n"))
DosTerm();
BUG(100, ("Enditall: DosTerm done\n"))
Write(g.outfile, "\n", 1);
XCEXIT(0);
}
void testbreak()
{
if (SetSignal(0,0) & (SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D))
{
Write(g.outfile, "***Break", 8);
enditall();
}
}
void main(argc, argv)
int argc;
char *argv[];
{
char diskname[31];
char *tmpchar, *usename;
int nameflag, nexttok, i;
#ifdef MYDEBUG
int j;
for(i=0; i<MAXDEBUG; i++) debug[i] = 0;
#endif
if(argc == 0) XCEXIT(5);
memset((char *)&g, 0, sizeof(struct MYGLOBAL));
#ifdef MYDEBUG
if(argc>1 && argv[1][0] == '-' && toupper(argv[1][1]) == 'D')
{
if(argv[1][2] == '*') i = -1;
else (void)stcd_i(argv[1]+2, &i);
if(i >= MAXDEBUG) i = 0;
(void)stcd_i(argv[2], &j);
if(i>= 0)
{
debug[i] = j;
printf("Debugging group %d initialized at level %d\n",i,j);
}
else
{
for(i=0; i<MAXDEBUG; i++) debug[i] = j;
printf("All debugging initialized at level %d\n", j);
}
argc-=2, argv+=2;
}
#endif
BUG(1, ("main: Entry\n"))
g.outfile = Output();
usename = diskname;
nameflag = FALSE;
for(nexttok=0; argc > 1; argc--, argv++)
{
if(argv[1][0] == '?')
{
PUTTERM(MSG_COPYRIGHT);
panic(MSG_USAGE);
}
else if(!nexttok && !stricmp(argv[1], "MANY"))
g.flags |= DW_MANY;
#ifdef NOTDOS
else if(!nexttok && !stricmp(argv[1], "NOTDOS"))
g.flags |= DW_NOTDOS;
#endif
else if(nexttok == 1 || (!nexttok &&
(toupper(argv[1][0]) == 'D' && toupper(argv[1][1]) == 'F' &&
(i = argv[1][2] - '0')>=0 && i < 4
)))
{
g.tdunit = i;
nexttok = 0;
}
else if(!nexttok && !stricmp(argv[1], "DRIVE"))
nexttok = 1;
else if(!nexttok && !stricmp(argv[1], "NAME"))
nexttok = 2;
else if(!nameflag)
{
usename = argv[1];
nameflag = TRUE;
nexttok = 0;
}
else
panic(MSG_USAGE);
}
TDInit();
DosInit(g.tdunit);
if(!(TDREQ(io_Data) = (APTR)AllocMem(MYIOSIZE, MEMF_CHIP|MEMF_CLEAR)))
panic(MSG_NOMEM);
globmsg[MSG_DESTROY][DESTROY_SPOT] = '0' + g.tdunit;
PUTTERM(MSG_DESTROY)
if(g.flags & DW_MANY) PUTTERM(MSG_CTRLBK)
diskname[30] = '\0';
do
{
TDMotOff();
PUTTERM(MSG_INSERT)
PUTTERM(nameflag ? MSG_USE : MSG_KEEP)
if(!Read(Input(), diskname, 30)) break;
testbreak();
if(diskname[0] != '\n' && (tmpchar=strchr(diskname, '\n')) )
{
*tmpchar = '\0';
usename = diskname;
nameflag = FALSE;
}
else if(!nameflag)
GetName(diskname);
TDREQ(io_Length) = MYIOSIZE;
#ifdef NOTDOS
if(g.flags & DW_NOTDOS)
{
strcpy((char *)TDREQ(io_Data), "DOS");
TDREQ(io_Offset) = 0;
TDIO(CMD_WRITE);
TDREQ(io_Offset) = 880*TD_SECTOR;
}
#endif
makeroot((long *)TDREQ(io_Data), usename);
TDIO(CMD_WRITE);
}
while(g.flags & DW_MANY);
enditall();
}
void TDIO(command)
UWORD command;
{
BUG(1, ("TDIO: Entry, command %d\n", command))
TDREQ(io_Command) = command;
DoIO((struct IORequest *)g.diskreq);
if(TDREQ(io_Error)) iopanic();
BUG(1, ("TDIO: Exit\n"))
}
void TDInit()
{
BUG(1, ("TDInit: Entry\n"))
if(!(g.diskport = NewPort()) || !(g.diskreq = CreateIOExtTD(g.diskport)))
panic(MSG_SYS);
ETDREQ(iotd_Count) = (unsigned long)0xffffffff;
TDREQ(io_Offset) = 880*TD_SECTOR;
BUG(10, ("TDInit: Port created, diskreq allocated\n"))
if(OpenDevice(TD_NAME, g.tdunit, (struct IORequest *)g.diskreq, 0))
iopanic();
g.flags |= DW_TDOPEN;
BUG(1, ("TDInit: Exit\n"))
}
void TDTerm()
{
BUG(1, ("TDTerm: Entry\n"))
if(g.flags & DW_TDOPEN)
{
if(TDREQ(io_Data))
{
BUG(100, ("Enditall: freeing io_Data\n"))
FreeMem((char *)TDREQ(io_Data), MYIOSIZE);
TDREQ(io_Data) = NULL;
}
if(g.errnum<2) TDMotOff();
CloseDevice((struct IORequest *)g.diskreq);
BUG(10, ("TDTerm: Device closed\n"))
DeleteIOExtTD(g.diskreq);
BUG(10, ("TDTerm: Diskreq freed\n"))
g.diskreq = (struct IOExtTD *)NULL;
}
if(g.diskport)
{
DisposePort(g.diskport);
g.diskport = (struct MsgPort *)NULL;
BUG(10, ("TDTerm: port deleted\n"))
}
BUG(1, ("TDTerm: Exit\n"))
}
void TDMotOff()
{
BUG(1, ("TDMotOff: Entry\n"))
TDREQ(io_Length) = 0;
if(!TDREQ(io_Error))
{
BUG(10, ("TDMotOff: Clearing track buffer\n"))
TDIO((UWORD)ETD_UPDATE);
TDIO((UWORD)ETD_CLEAR);
}
TDIO((UWORD)ETD_MOTOR);
BUG(1, ("TDMotOff: Exit\n"))
}
void MemCleanup(){}